﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Reflection;

using DevExpress.XtraEditors;
using Westwind.wwScripting;

namespace SCMainAPP.BLL
{
    abstract class BasicBLL: DAL.BasicDAL
    {
        static wwScripting loScript = new wwScripting("C#");

        private void FrmToDto(XtraForm frm, object DTO)
        {
            if ((frm != null) && (DTO != null))
            {
                //int prpCount = 0;
                int countControl = 0;
                //pega todas as propriedades do Objeto
                PropertyInfo[] propt = DTO.GetType().GetProperties();

                //itera pelas Propriedades
                foreach (PropertyInfo propriedade in propt)
                {
                    //itera pelo Form
                    foreach (System.ComponentModel.Component comp in frm.Controls)
                    {
                        //se o componente tiver o mesmo nome da propriedade, seta o valor da propriedade conforme o elemento
                        if ((frm.Controls[countControl].Tag!=null) &&(frm.Controls[countControl].Tag.ToString() == propriedade.Name))
                        {

                            if (propriedade.PropertyType == typeof(string))
                            {
                                propriedade.SetValue(DTO, frm.Controls[countControl].Text, null);
                            }
                            else if (propriedade.PropertyType == typeof(int))
                            {
                                if(String.IsNullOrEmpty(frm.Controls[countControl].Text))
                                {
                                    return;
                                }
                                else
                                {
                                    try
                                    {
                                        propriedade.SetValue(DTO, Convert.ToInt32(frm.Controls[countControl].Text), null);
                                    }
                                    catch
                                    {
                                        return;
                                    }
                                }
                            }
                            else if (propriedade.PropertyType == typeof(double))
                            {
                                propriedade.SetValue(DTO, Convert.ToDouble(frm.Controls[countControl].Text), null);
                            }
                        }
                        countControl++;
                    }
                    countControl = 0;                    
                }
            }
        }

        private void DtoToFrm(XtraForm frm, object DTO)
        {
            if ((frm != null) && (DTO != null))
            {
                //extrai as propriedades do Objeto.
                PropertyInfo[] propt = DTO.GetType().GetProperties();
                int countControl = 0;

                //itera pelas Propriedades
                foreach (PropertyInfo propriedade in propt)
                {
                     //itera pelo Form
                    foreach (System.ComponentModel.Component comp in frm.Controls)
                    {                        
                        //se o componente tiver o mesmo nome da propriedade, seta o valor da propriedade conforme o elemento
                        if ((frm.Controls[countControl].Tag != null) && (frm.Controls[countControl].Tag.ToString() == propriedade.Name))
                        {                            
                            frm.Controls[countControl].Text = propriedade.GetValue(DTO, null).ToString();                           
                        }
                        countControl++;
                    }
                    countControl = 0;
                }
            }
        }

        /// <summary>
        /// Manipula interaçao Form X DTO
        /// </summary>
        /// <param name="xFrm">xTraForm</param>
        /// <param name="dto">Dto que vai ser carregada/alimentada</param>
        /// <param name="ident">Identificador de Direçao</param>
        public virtual void DtoHandler(XtraForm xFrm, object dto, char ident)
        {
            switch (ident)
            {
                case 'F':
                    FrmToDto(xFrm, dto);
                    break;
                case 'D':
                    DtoToFrm(xFrm, dto);
                    break;
                default:
                    break;
            }
        }

        public static void ExecutaMetodo(string sEscopo)
        {
            
            loScript.lSaveSourceCode = true;

            // loScript.CreateAppDomain("WestWind");  // force into AppDomain
            //loScript.AddAssembly("system.windows.forms.dll", "System.Windows.Forms");
            //loScript.AddAssembly("system.web.dll","System.Web");
            //loScript.AddNamespace("System.Net");

            string lcCode = sEscopo;
            int x = 100;
            string lcResult = (string)loScript.ExecuteCode(lcCode,"Fast Codes", (int)x, (decimal)10);

            //*** Execute full method or mutliple methods on the same object
            //			string lcResult = (string) loScript.ExecuteMethod(lcCode,"Test","rick strahl",(int) x);
            //			lcResult =  (string) loScript.CallMethod(loScript.oObjRef,"Test2","rick strahl",(int) x);

            //this.txtGeneratedCode.Text = loScript.cSourceCode;

            if (loScript.bError)
                XtraMessageBox.Show(loScript.cErrorMsg + "\r\n\r\n" + loScript.cSourceCode,
                                "Compile ", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);


            loScript.Dispose();
        }
    }
}
